import * as Router from '@/router/index';
import * as status from '@/utils/status';
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';
import useUserStore from '@/stores/user';
import useAppStore from '@/stores/app';
import  { getToken } from '@/utils/storage';


// 路由白名单，不需要权限
const whiteList = Router.constantRoutes.map(item => item.path);

NProgress.configure({ showSpinner: false });

/*
// 放开的无权限
Router.default.beforeEach((to, from, next) => {
  NProgress.start();
  // 修改页面title标题，如页面需要单设标题使用to.meta.title或者页面加载后的钩子里改document.title
  document.title = to.meta && to.meta.title ? to.meta.title : status.global.projectTitle;
  next();
});
*/


// 待测试的权限控制
let userStore = null,
    appStore = null;

Router.default.beforeEach(async (to, from, next) => {
  NProgress.start();
  // 修改页面title标题，如页面需要单设标题使用to.meta.title或者页面加载后的钩子里改document.title
  // document.title = to.meta && to.meta.title ? to.meta.title : status.global.projectTitle;
  appStore = appStore ? appStore : useAppStore();
  userStore = userStore ? userStore : useUserStore();
  // 修改页面title标题，如页面需要单设标题使用to.meta.title或者页面加载后的钩子里改document.title
  let title = to.meta && to.meta.title ? to.meta.title : status.global.projectTitle;
  document.title = to.meta && to.meta.rewriteTitle ? `${userStore.currentModalTitle}${title}` : title;
  // 不需要权限、登录、角色验证路由
  if (!appStore.hasPromission) {
    // console.log('系统不需要权限')
    // 已经修改过路由 - 直接放行
    if (appStore.isAddRoutes) {
      // console.log('系统不需要权限 - 已修改路由')
      next();
    } else {
      // console.log('系统不需要权限 - 未修改路由')
    // 加载全部的异步路由
      Router.dynamicRoutes.forEach(item => {
        Router.default.addRoute(item);
      });
      userStore.changeCurrentRoutes(Router.dynamicRoutes);
      appStore.changeIsAddRoutes(true)
      next({...to, replace: true});
    }
    return;
  } else {
    // console.log('系统需要权限')
    // 需要权限、登录、角色验证路由
    const hasToken = !!getToken();
    if (!hasToken){
      // console.log('系统需要权限 - 用户未登录')
      // 用户未登录
      if (whiteList.find(item => to.path === item)) {
        // console.log('系统需要权限 - 用户未登录 - 前往白名单')
        // 前往页面在白名单中
        next();
      } else {
        // console.log('系统需要权限 - 用户未登录 - 重定向到登录页')
        // 配置路径中的参数
        const queryStr = Object.keys(to.query).reduce((str, key) => str += `&${key}=${to.query[key]}`, '');
        next(`/login?redirect=${to.path}${queryStr}`);
      }
    } else {
      if (appStore.isAddRoutes){
        // console.log('已登录 - 筛选过路由');
        if (to.path == '/login'){
          function filterQuery(queryObj){
            let queryKeys = Object.keys(queryObj);
            return queryKeys.reduce((obj, key) => {
              if (key !== 'redirect'){
                obj[key] = queryObj[key];
              }
            }, {});
          }
          // console.log('已登录 - 筛选过路由 - 去往登录页重定向')
          let path = '/',
              query = {};
          path = to.query && to.query.redirect ? to.query.redirect : '/';
          query = to.query ? filterQuery(to.query) : '';
          next({
            path,
            query
          });
        } else {
          // console.log('已登录 - 筛选过路由 - 去往非登录页放行');
          // console.log(Router.default.getRoutes())
          // console.log(to.fullPath)
          next();
        }
      } else {
        try {
          if (userStore.role !== null){
            // console.log('已登录 - 未筛选过路由 - 从缓存加载role筛选')
            userStore.setCurrentRoutes(userStore.role);
          } else {
            // console.log('已登录 - 未筛选过路由 - 请求userinfo筛选')
            await userStore.getCurrentUserInfo();
          }
          next({...to});
        } catch(error){
          userStore.logout();
          // 配置路径中的参数
          const queryStr = Object.keys(to.query).reduce((str, key) => str += `&${key}=${to.query[key]}`, '');
          next(`/login?redirect=${to.path}${queryStr}`);
        }
      }
    }
  }
});

Router.default.afterEach(() => {
  NProgress.done();
});